package com.sxt.pro.rabbitmq;

import java.io.IOException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**  

* @Description: 消费者

* @author xinxiaokang  

* @date 2020年8月26日 下午3:39:20

*/
public class Consumer {
	
	//队列
	private static final String QUEUE = "helloworld";
	
	public static void main(String[] args) {
		//通过工厂创建新的连接和mq建立连接
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("127.0.0.1");  //地址
		factory.setPort(5672);         //端口
		factory.setUsername("guest");  //用户名
		factory.setPassword("guest");  //密码
		//设置虚拟机，一个mq服务可以设置多个虚拟机，每个虚拟机就相当于一个独立的mq
		factory.setVirtualHost("/");
		//建立连接
		Connection connection = null;
		
		//建立新连接
		try {
			connection = factory.newConnection();
			//创建会话通道:生产者和mq服务所有通讯都在此完成
			Channel channel = connection.createChannel(); 
			/**
			 * 声明队列：如果队列没有，则创建
			 * 参数：
			 * 1、队列名称
			 * 2、是否持久化，如果持久化，mq重启后队列还在
			 * 3、是否独占连接，
			 * 4、自动删除 
			 */
			channel.queueDeclare(QUEUE,true,false,false,null);
			
			//实现消费方法
			DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
				/**
				 * 当接收到消息后，此方法被调用
				 * 1、消费者标签
				 * 2、信封
				 * 3、消息属性
				 * 4、消息内容
				 */
				@Override
				public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
						byte[] body) throws IOException {
					//交换机
					String exchange = envelope.getExchange();
					//消息id,标识消息id，可确认消息已接收
					long deliveryTag = envelope.getDeliveryTag();
					//消息内容
					String message = new String(body,"utf-8");
					System.out.println("receive message:" + message);
					
				}
				 
			};
			
			/**
			 * 监听队列
			 * 参数明细
			 * 1、queue 队列名称
			 * 2、autoAck 自动回复
			 * 3、callback 消费方法，当消费者收到消息要执行的方法
			 */
			channel.basicConsume(QUEUE,true,defaultConsumer);
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
	}
	
	
	
	
}
